package cdu.sl.service.impl;

import cdu.sl.dto.SaveRoleDTO;
import cdu.sl.entity.Permission;
import cdu.sl.entity.Role;
import cdu.sl.entity.RolePermission;
import cdu.sl.mapper.RoleDao;
import cdu.sl.mapper.RolePermissionDao;
import cdu.sl.service.RoleService;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.Optional;
import java.util.Set;

@Service
@RequiredArgsConstructor
public class RoleServiceImpl implements RoleService {
    private final RoleDao roleDao;

    private final RolePermissionDao rolePermissionDao;

    /**
     * 新增角色
     *
     * @param saveRoleDTO 新增角色详细信息
     */
    @Override
    @Transactional
    public void add(SaveRoleDTO saveRoleDTO) {
        savaRoleInfo(saveRoleDTO);
    }

    /**
     * 修改角色
     *
     * @param saveRoleDTO 修改角色详细信息
     */
    @Override
    public void update(SaveRoleDTO saveRoleDTO) {
        savaRoleInfo(saveRoleDTO);
    }

    /**
     * 删除角色
     *
     * @param id 角色id
     */
    @Override
    public void delete(Integer id) {
        roleDao.deleteById(id);
    }

    /**
     * 获取所有角色
     *
     * @return 所有角色信息列表
     */
    @Override
    public List<Role> findAll() {
        return roleDao.findAll();
    }

    @Override
    public Role getById(Integer id) {
        Optional<Role> opt = roleDao.findById(id);
        return opt.orElse(null);
    }


    private void savaRoleInfo(SaveRoleDTO saveRoleDTO) {
        // 保存基本信息到role表中
        Role role = new Role();
        BeanUtils.copyProperties(saveRoleDTO, role);
        roleDao.save(role);
        // 保存权限信息到role_permission表中
        Set<Permission> permissionSet = saveRoleDTO.getPermissionSet();
        if (permissionSet != null && !permissionSet.isEmpty()) {
            for (Permission permission : permissionSet) {
                RolePermission rolePermission = new RolePermission();
                rolePermission.setRoleId(role.getId());
                rolePermission.setPermissionId(permission.getId());
                rolePermissionDao.save(rolePermission);
            }
        }
    }


}
